package org.sam.swing.table;

import java.math.BigDecimal;
import java.text.ParseException;
import java.util.Date;

/**
 * 数据转换工具，运行时候生成数据的
 * 
 * @author sam
 *
 */
public interface DataTranslator {

	/**
	 * 获取当前绑定的列
	 * 
	 * @return
	 */
	public JSTableColumn geTableColumn();

	/**
	 * 设置列属性
	 * 
	 * @param tableColumn
	 */
	public void seTableColumn(JSTableColumn tableColumn);

	/**
	 * 转换的目标类型
	 * 
	 * @return
	 */
	public Class<?> getTargetClass();

	/**
	 * 设置转换目标类型
	 * 
	 * @param clazz
	 */
	public void setTargetClass(Class<?> clazz);

	/**
	 * 转换数据的方法
	 * 
	 * @param value
	 * @throws ParseException
	 *             转换异常抛出
	 * @return
	 */
	public default Object getDataTranstor(Object value) throws ParseException {
		if (value == null)
			return null;

		if (this.getTargetClass() == null)
			return value;

		if (this.geTableColumn() == null)
			return value;

		return getDataTranstor(this.geTableColumn(), value, this.getTargetClass());
	}

	/**
	 * 转换数据的方法
	 * 
	 * @param col
	 * @param value
	 * @param targetCls
	 *            目标的类类型
	 * @throws ParseException
	 *             转换异常抛出
	 * @return
	 */
	public static Object getDataTranstor(JSTableColumn col, Object value, Class<?> targetCls) throws ParseException {
		if (value == null)
			return null;

		if (targetCls == null)
			return value;

		if (targetCls.equals(Integer.class)) {
			if (value.toString().trim().length() <= 0) {
				return col.getCanBeNull() ? null : 0;
			} else if (value.equals("true") || value.equals("false")) {
				return value.equals("true") ? 1 : 0;
			} else if (value instanceof Boolean) {
				return value.equals(true) ? 1 : 0;
			} else {
				return Integer.parseInt(value.toString());
			}
		} else if (targetCls.equals(String.class)) {
			return value.toString();
		} else if (targetCls.equals(Double.class)) {
			if (value.toString().trim().length() <= 0) {
				return col.getCanBeNull() ? null : 0d;
			} else {
				return Double.parseDouble(value.toString());
			}
		} else if (targetCls.equals(Float.class)) {
			if (value.toString().trim().length() <= 0) {
				return col.getCanBeNull() ? null : 0f;
			} else {
				return Float.parseFloat(value.toString());
			}
		} else if (targetCls.equals(Long.class)) {
			if (value.toString().trim().length() <= 0) {
				return col.getCanBeNull() ? null : 0l;
			} else {
				if (value.toString().equals("true"))
					return 1L;
				else if (value.toString().equals("false"))
					return 0L;
				else
					return Long.parseLong(value.toString());
			}
		} else if (targetCls.equals(Character.class)) {
			if (value.toString().trim().length() <= 0) {
				return col.getCanBeNull() ? null : ' ';
			} else {
				return value.toString().toCharArray()[0];
			}
		} else if (targetCls.equals(Boolean.class)) {
			if (value.toString().trim().length() <= 0) {
				return false;
			} else {
				return Boolean.parseBoolean(value.toString());
			}
		} else if (targetCls.equals(Short.class)) {
			if (value.toString().trim().length() <= 0) {
				return col.getCanBeNull() ? null : (short) 0;
			} else {
				return Short.parseShort(value.toString());
			}
		} else if (targetCls.equals(Date.class)) {
			if (value instanceof Date) {
				return value;
			} else if (value.toString().trim().equals("") || value.equals("0000-00-00") || value.equals("0000/00/00")
					|| value.equals("0000-00-00 00:00:00") || value.equals("0000-00-00-00-00-00")
					|| value.equals("0000/00/00 00:00:00")) {
				return null;
			} else {
				return col.getFormator().parseObject(value.toString());
			}
		} else if (targetCls.equals(BigDecimal.class)) {
			return new BigDecimal(value.toString());
		} else {
			return value;
		}
	}
}
